package com.gitee.cnlongdb.basic.utils.socket;

import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.Channel;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.SocketChannel;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.gitee.cnlongdb.basic.constant.LongDbConstant;

public class SocketUtils {

	private static final Logger logger = (Logger) LoggerFactory.getLogger(SocketUtils.class);
	
	/**
	 * 功能描述：向客户端发送数据
	 × 模块作者：ZOUYONG
	 × 开发时间：2018年12月21日 下午2:07:49
	 × 返回数据：void
	 */
	public static void sendToClient(Selector selector, String content) throws IOException {
		// 遍历selector里注册的所有SelectionKey
		for (SelectionKey key1 : selector.keys()) {
			// 获取该key对应的Channel
			Channel targerChannel = key1.channel();
			// 如果该Channel是SocketChannel对象
			if (targerChannel instanceof SocketChannel) {
				// 将读取到的内容写入该Channel中
				SocketChannel dest = (SocketChannel) targerChannel;
				sendToClient(dest, content);
			}
		}
	}

	/**
	 * 功能描述：向指定频道发送数据
	 × 模块作者：ZOUYONG
	 × 开发时间：2018年12月21日 下午2:09:44
	 × 返回数据：void
	 */
	public static void sendToClient(SocketChannel channel, String data) throws IOException {
		try {
			channel.write(LongDbConstant.charset.encode(data));
		} catch(Exception e) {
			// channel.socket().shutdownOutput();
			logger.error("Socket发送数据异常：" + e.getMessage());
		}
	}
	
	/**
	 * 功能描述：读取客户端数据
	 × 模块作者：ZOUYONG
	 × 开发时间：2018年12月21日 下午2:04:25
	 × 返回数据：String
	 */
	public static String receiveEachData(SocketChannel socketChannel, int buffSize) throws IOException {
		StringBuffer content = new StringBuffer("");
		ByteBuffer buffer = ByteBuffer.allocate(buffSize);
		try {
			while (socketChannel.read(buffer) > 0) {
				buffer.flip(); // 把buffer的当前位置更改为buffer缓冲区的第一个位置
				content.append(LongDbConstant.charset.decode(buffer)); 
			}
		} catch(Exception e) {
			logger.error("读取请求数据异常：" + e.getMessage());
		}
		buffer.clear();
		return content.toString();
	}
	
}
